/**
 * @param {number[]} nums
 * @return {number[][]}
 */
/* 
为了生成数组的所有全排列，可以使用回溯法。回溯法通过递归遍历每个可能的数字选择，逐步构建排列，直到所有数字被使用。

方法思路
递归回溯：维护一个当前路径和一个已使用的数字集合，递归选择未使用的数字，将其加入路径并标记为已使用，然后继续处理剩余数字。
回溯撤销：递归返回后，撤销当前选择，将数字标记为未使用，以便尝试其他可能性。
终止条件：当路径长度等于数组长度时，说明已生成一个完整的排列，将其加入结果集。
*/
var permute = function (nums) {
  const result = [];
  const used = new Array(nums.length).fill(false);

  // 回溯函数：path表示当前排列
  const backtrack = (path) => {
    // 当路径长度等于数组长度时，加入结果集
    if (path.length === nums.length) {
      result.push([...path]);
      return;
    }

    // 遍历所有可能的数字选择
    for (let i = 0; i < nums.length; i++) {
      // 如果数字已被使用，跳过
      if (used[i]) continue;

      // 选择当前数字
      used[i] = true;
      path.push(nums[i]);

      // 递归处理剩余数字
      backtrack(path);

      // 回溯，撤销选择
      path.pop();
      used[i] = false;
    }
  };

  // 从空路径开始回溯
  backtrack([]);

  return result;
};